export interface TorchModeJson {
  bias: number[]
  weight: number[]
  class_name: 'nn.SpatialConvolutionMM' | 'nn.SpatialFullConvolution'
  padH: number
  padW: number
  nOutputPlane: number
  nInputPlane: number
  dH: number
  dW: number
  kH: number
  kW: number
}
/**
 * 当前支持的模型
 */
export enum UpscaleModel {
  waifu_2x_scale = 'waifu_2x_scale',
  waifu_2x_noise = 'waifu_2x_noise',
  RealESRGANAnimModel = 'RealESRGANAnimModel',
  RealESRGANModel = 'RealESRGANModel',
}
/**
 * 调用图片放大接口参数
 */
export interface ImageUpscaleParams {
  /**
   * 分块大小
   */
  blockSize: number
  /**
   * 调用模型队列
   */
  modelQueue: UpscaleModel[]
  /**
   * 原始图像数据
   */
  imageData: Uint8Array
  /**
   * 图像宽高
   */
  width: number
  /**
   * 图像高
   */
  height: number
  /**
   * 图像通道数
   */
  channels: number
}

export enum LoadStatus {
  /**
   * 未加载
   */
  init,
  loading,
  loaded,
  /**
   * 加载失败
   */
  error,
}
export enum RunBack {
  cpu = 'cpu',
  webgl = 'webgl',
  webgpu = 'webgpu',
  wasm = 'wasm',
}
/**
 * 消息类型（主线程发送给worker的消息）
 */
export type SendWorkerMessage =
  //预测
  | {
      type: 'predict'
      data: ImageUpscaleParams
    }
  //获取模型加载状态
  | {
      type: 'getModelList'
    }
  // 获取后端 cpu|webgl
  | {
      type: 'getBackend'
    }
  // 设置后端 cpu|webgl
  | {
      type: 'setBackend'
      data: RunBack
    }
  // 请求加载模型
  | {
      type: 'requestLoadModel'
      data: UpscaleModel
    }
  | {
      type: 'stop'
    }

/**
 * 消息类型（worker返回主线程的消息）
 */
export type RespWorkerMessage =
  //获取模型加载状态
  | {
      type: 'getModelList'
      data: ModelInfo[]
    }
  // 返回当前使用的运行后端
  | {
      type: 'getBackend'
      data: RunBack
    }
  // 预测进度
  | {
      type: 'predictProgress'
      data: {
        /**
         * 执行的模型队列数量
         */
        modelQueryCount: number
        /**
         * 当前执行的模型下标
         */
        currentQuery: number
        /**
         * 当前模型执行进度
         */
        progress: number
      }
    }
  // 模型加载状态改变是触发
  | {
      type: 'modelStatusChange'
      data: ModelInfo
    }
  // 模型加载进度改变是触发
  | {
      type: 'modelLoadProgress'
      data: ModelInfo
    }
  // 预测结果
  | {
      type: 'predictResult'
      data: {
        result: Uint8ClampedArray
        width: number
        height: number
        predictTime: number
      }
    }
  // 运行状态发送改变时回调
  | {
      type: 'runStatusChange'
      data: boolean
    }
  | {
      type: 'setBackend'
      data: boolean //是否修改成功
    }
  // 发送错误回调
  | {
      type: 'error'
      //错误信息
      data: string
    }
  // webwork初始化成功
  | {
      type: 'ready'
      data: true
    }

export interface ModelInfo {
  name: UpscaleModel
  status: LoadStatus
  loadBytes: number
  progress: number
}
